/**
 * @file mg_heating.h
 * @author Charry_Le (530673764@qq.com)
 * @brief
 * @version 0.1
 * @date 2024-02-17
 *
 * @copyright Moorgen Intelligent Technologies Copyright (c) 2024
 *
 */

#ifndef __MG_HEATING_H__
#define __MG_HEATING_H__
#include "ite/itp.h"

/*******************************地暖默认参数**************************************/
// 防冻温度
#define DEV_ANTI_TEMP_MAX 7
#define DEV_ANTI_TEMP_MIN 5
// 默认地暖温度上下限
#define HEAT_TEMP_MAX 60 // 30.0
#define HEAT_TEMP_MIN 10 // 5.0
// 节能模式温度
#define DEV_SAVE_TEMP 18 // 18.0

#pragma pack(push) //开始对齐
#pragma pack(1)    //内存以1字节对齐
// 地暖状态
typedef struct
{
    bool Switch;        // 开关机状态
    float UserTemp;     // 用户设置温度
    uint8_t AntiFreeze; // 防冻开关
    bool OccupyState;   // 占用状态
} STRUCT_HEAT_VALU;

// 四时间段编程
#define TIME_TEMP_MAX 4      // 时间段数
#define TIME_TEMP_WEEK_MAX 7 // 星期数
typedef struct __STRUCTS_TIME_TEMP__
{
    uint8_t Hour; // 时
    uint8_t Min;  // 分
    uint8_t Temp; // 温度
} TIME_TEMP_TYPE;

typedef struct __TIME_TEMP_PRO_TYPE_OLD__
{
    TIME_TEMP_TYPE Term[TIME_TEMP_MAX];
} TIME_TEMP_PRO_TYPE_OLD;

typedef struct __STRUCTS_TIME_TEMP_PRO__
{
    uint8_t Week; // 周
    TIME_TEMP_TYPE Term[TIME_TEMP_MAX];
} TIME_TEMP_PRO_TYPE;

// 定时时间结构

typedef struct __STRUCT_TEMP_TIMER_OLD__
{
    bool Switch;         // 开关状态
    uint8_t Hour;        // 时
    uint8_t Minute;      // 分
} STRUCT_TEMP_TIMER_OLD; // 老结构体
#define TIMER_VALU_MAX 2 // 定时数量
typedef struct __STRUCT_TEMP_TIMER__
{
    uint8_t Hour;   // 时
    uint8_t Minute; // 分
} STRUCT_TEMP_TIMER;
typedef union
{
    uint8_t ConfigTable[256];
    struct
    {
        uint8_t Save_Flag;                               // 是否储存标志
        uint8_t TimerEn;                                 // 定时使能v
        STRUCT_TEMP_TIMER Timer[TIMER_VALU_MAX];         // 定时器时间v
        bool TimeTempEn;                                 // 四时间段编程使能v
        TIME_TEMP_PRO_TYPE TimeTemp[TIME_TEMP_WEEK_MAX]; // 四时间段编程v
        struct
        {
            uint8_t Max : 7;   // 温度范围最大值
            uint8_t Grads : 1; // 温度梯度/精度（0x00:0.5度,0x01:1度）
            uint8_t Min : 7;   // 温度范围最小值
            uint8_t res : 1;   // 预留
        } Heat_Temp_Range;     // 地暖温度范围
        struct
        {
            uint8_t Switch_On_En : 1;  // 开地暖禁使能
            uint8_t Switch_Off_En : 1; // 关地暖禁使能
            uint8_t res : 5;
            uint8_t Immobilization : 1; // 固定位（固定为0）
        } Switch_function;              // 开关禁使能
        uint8_t res[4];					// 背光
    } byte;
} HEAT_CONFIG;
#pragma pack(pop) // 结束对齐

extern STRUCT_HEAT_VALU Heat;
extern STRUCT_HEAT_VALU Heat_After_Occupy; // 占用后地暖状态
extern HEAT_CONFIG Heat_Config;

// 地暖开关控制
void Heat_Switch_Set(bool Switch);
// 地暖温度控制
void Heat_Temp_Set(float Temperature);
// 地暖节能
void Heat_ECO_Set(void);
// 地暖防冻设置
void Heat_AntiFreeze_Set(bool Switch);
// 地暖定时使能设置
void Heat_Timer_Enable_Set(bool Switch);
// 地暖四时段使能设置
void Heat_Four_Timer_Enable_Set(bool Switch);
// 设置地暖开关使能
void Set_Heat_Switch_Enable(bool Switch, bool Enable);
//地暖定时逻辑(每分钟调用一次)
void Heat_Timer_Handle(void);
#endif